package com.zxh.blog.activity

import android.annotation.SuppressLint
import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.text.TextUtils
import android.widget.EditText
import android.widget.ImageButton
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import androidx.core.widget.addTextChangedListener
import androidx.fragment.app.Fragment
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.gyf.immersionbar.ImmersionBar
import com.zxh.blog.R
import com.zxh.blog.fragment.HistoryFragment
import com.zxh.blog.fragment.SearchResultFragment

class SearchActivity : AppCompatActivity(), HistoryFragment.OnSearchHistoryClickListener {

    // 返回按钮
    private lateinit var mBackBtn: ImageButton

    // 搜索框
    private lateinit var mSearchEdit: EditText

    // 搜索按钮
    private lateinit var mSearchBtn: TextView

    // 清除搜索框文本内容的按钮
    private lateinit var mClearEditTextBtn: ImageButton

    // SharedPreferences对象
    private lateinit var mSharedPreferences: SharedPreferences

    // 历史记录表
    private val mSearchRecordsList = mutableListOf<String>()

    // 搜索功能用到的token
    private var mToken = ""

    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search)

        // 设置顶部状态栏颜色
        ImmersionBar.with(this)
            .statusBarColor(R.color.white)
            .statusBarDarkFont(true)
            .fitsSystemWindows(true)
            .init()

        // 默认显示历史记录页面
        replaceFragment(HistoryFragment())

        // 初始化控件
        mBackBtn = findViewById(R.id.btn_back)
        mSearchEdit = findViewById(R.id.etSearch)
        mSearchBtn = findViewById(R.id.tv_search)
        mClearEditTextBtn = findViewById(R.id.btn_clear_edit)
        mSharedPreferences = getSharedPreferences("search_history", Context.MODE_PRIVATE)

        // 从本地获取历史记录，存到本地变量mSearchRecordsList
        restoreSearchHistory()

        // 只有输入文本后此按钮才会显示
        mClearEditTextBtn.isVisible = false

        // 返回上一个页面
        mBackBtn.setOnClickListener {
            finish()
        }

        // 点击搜索按钮，切换到SearchResultFragment
        mSearchBtn.setOnClickListener {
            search()
        }

        // 监听搜索框文本内容
        mSearchEdit.addTextChangedListener {
            val searchText = mSearchEdit.text.toString()
            if (!TextUtils.isEmpty(searchText)) {
                mClearEditTextBtn.isVisible = true
            }
        }

        // 清空搜索框文本内容
        mClearEditTextBtn.setOnClickListener {
            mSearchEdit.setText("")
            mClearEditTextBtn.isVisible = false
            replaceFragment(HistoryFragment())
        }
    }

    override fun onSearchHistoryClick(text: String) {
        mSearchEdit.setText(text)
        // 将光标放到文本的最后
        val textLength = mSearchEdit.text.length
        mSearchEdit.setSelection(textLength)
        // 执行搜索功能
        search()
    }

    /**
     *  搜索功能
     */
    private fun search() {
        val searchText = mSearchEdit.text.toString().trim()
        if (!TextUtils.isEmpty(searchText)) {
            // 将搜索记录存储到 SharedPreferences
            saveSearchHistory(searchText)
            val sp = getSharedPreferences("search_token", Context.MODE_PRIVATE)
            mToken = sp.getString("token", "").toString()
            // 切换至 SearchResultFragment
            replaceFragment(SearchResultFragment.newInstance(searchText, mToken))
        } else {
            Toast.makeText(this, "请输入搜索内容", Toast.LENGTH_SHORT).show()
        }
    }

    /**
     * 将记录保存到本地（使用 List 存储记录）
     */
    private fun saveSearchHistory(text: String) {
        // 删除单个或全部历史记录时，因为当前Activity中的mSearchRecordsList里仍有从前的记录
        // 所以会出现bug --> 删除历史记录后，如果没有重启app，继续在搜索框中搜索，搜索后历史记录
        // 就会出现之前删除过的记录。
        // 解决方案：每次点击搜索按钮时，先清空mSearchRecordsList，然后从SP中获取最新的数据，其他操作不变
        mSearchRecordsList.clear()
        val historyJson = mSharedPreferences.getString("search_history", null)
        if (historyJson != null) {
            mSearchRecordsList.addAll(Gson().fromJson(historyJson, object : TypeToken<List<String>>() {}.type))
        }
        // 如果搜索记录已经存在于 list 中，则先将其删除
        if (mSearchRecordsList.contains(text)) {
            mSearchRecordsList.remove(text)
        }
        // 将搜索记录插入到 list 的最前面
        mSearchRecordsList.add(0, text)
        // 如果记录数量超过 10 条，则删除最后一条
        if (mSearchRecordsList.size > 20) {
            mSearchRecordsList.removeAt(mSearchRecordsList.lastIndex)
        }
        // 将搜索记录保存到 SharedPreferences 中
        mSharedPreferences.edit().putString("search_history", Gson().toJson(mSearchRecordsList)).apply()
    }

    /**
     * 从本地恢复搜索记录（使用 List 存储记录）
     */
    private fun restoreSearchHistory() {
        val historyJson = mSharedPreferences.getString("search_history", null)
        if (historyJson != null) {
            mSearchRecordsList.addAll(Gson().fromJson(historyJson, object : TypeToken<List<String>>() {}.type))
        }
    }

    private fun replaceFragment(fragment: Fragment) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.fragmentContainer, fragment)
            .commit()
    }


}